package show.lmm.server.sent.events.controller;

import org.springframework.http.MediaType;
import org.springframework.http.codec.ServerSentEvent;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping()
public class IndexController {

    private List<String> contents = new ArrayList<>() {{
        add("春天是一年中最美丽的季节之一，因为它代表着新生和希望。当树木重新变绿、花朵绽放，大地开始焕发生机和活力，我们可以感受到春天的到来。");
        add("在春天，天气温暖，阳光明媚，这是一个非常适合户外活动的季节。人们可以到公园里散步，跑步或骑自行车，享受大自然的美丽和清新的空气。在这个季节里，野生动物也开始出现，你可以看到小鸟在树枝上唱歌，蝴蝶在花朵间飞舞。");
        add("春天也是一个种植和园艺的好季节。在春天，大多数植物和花卉都开始生长，人们可以开始在花园里播种，培育他们的爱好，享受与大自然亲密接触的乐趣。在城市里，许多人也会在家里或阳台上种植花卉，让自己的居住环境变得更加美丽和舒适。");
        add("春天也是一个新的开始，很多人会在这个季节里寻找新的机会，开始新的计划和冒险。学生们会迎来新的学期，企业也会制定新的发展计划。这个季节的气氛充满了希望和激情，让人们感到鼓舞和振奋。");
        add("最重要的是，春天也是一个感恩的季节。春天的到来意味着过去的冬天已经过去，我们可以迎接新的开始和新的机会。我们应该珍惜这个季节，感谢我们所拥有的一切，享受生活的美好和快乐。");
        add("春天的气息是怎样的呢？当你走在街道上时，你会感受到空气中充满了新鲜和清新的味道，这是因为春天的雨水让空气中的尘土和杂质被清洗干净，让空气变得更加清新和宜人。此外，春天的天空也变得更加明亮和清澈，让人们的心情也跟着变得更加明朗和愉悦。");
        add("在春天，我们可以看到自然界的奇迹。树木重新长出新的叶子，花朵也开始绽放。光是看到这些美景，就能让我们的心情变得更加舒畅和愉悦。此外，在春天，我们也能看到很多动物和昆虫开始活跃，它们也在享受这个充满活力和生机的季节。");
        add("春天也是一个充满希望和梦想的季节。在这个季节里，我们可以看到很多人开始新的计划和冒险，他们都希望能够在这个充满生机和希望的季节里实现自己的梦想和计划。此外，在春天，很多人也会感到自己有更多的精力和动力去做一些事情，这也让人们感到充满了希望和信心。");
        add("最后，春天也是一个充满感恩和爱的季节。在这个季节里，我们应该珍惜自己所拥有的一切，感恩生命的美好和幸福。我们也应该关注周围的人和事，去帮助和关心那些需要我们的人，让我们的生活变得更加美好和有意义。");
        add("总之，春天是一个充满生机和希望的季节，它让我们看到自然界的奇妙和人类的希望。让我们珍惜这个季节，去享受它带来的美好和快乐。");
    }};

    @GetMapping(value = "/index", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<ServerSentEvent> serverSentEvents() {
        return Flux.create(sink -> {
            for (int i = 0, length = contents.size(); i < length; i++) {
                sink.next(ServerSentEvent.builder("event").event("appendP").build());
                for (int j = 0, jLength = contents.get(i).length(); j < jLength; j++) {
                    sink.next(ServerSentEvent.builder(String.valueOf(contents.get(i).charAt(j))).build());
                    try {
                        Thread.sleep(160);
                    } catch (InterruptedException e) {
                        sink.next(ServerSentEvent.builder("server error" + i).build());
                    }
                }
            }
            sink.next(ServerSentEvent.builder("complete").event("complete").build());
            sink.complete();
        });
    }
}
